home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 September / Enter 09 2006.iso / Internet / SpamExperts Home 1.1 / SpamExperts Home.exe / lib / spamexperts.modules / ImageStat.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-07-14  |  4.5 KB  |  161 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import Image
  5. import operator
  6. import math
  7.  
  8. class Stat:
  9.     '''Get image or feature statistics'''
  10.     
  11.     def __init__(self, image_or_list, mask = None):
  12.         
  13.         try:
  14.             if mask:
  15.                 self.h = image_or_list.histogram(mask)
  16.             else:
  17.                 self.h = image_or_list.histogram()
  18.         except AttributeError:
  19.             self.h = image_or_list
  20.  
  21.         if type(self.h) != type([]):
  22.             raise TypeError, 'first argument must be image or list'
  23.         
  24.         self.bands = range(len(self.h) / 256)
  25.  
  26.     
  27.     def __getattr__(self, id):
  28.         '''Calculate missing attribute'''
  29.         if id[:4] == '_get':
  30.             raise AttributeError, id
  31.         
  32.         v = getattr(self, '_get' + id)()
  33.         setattr(self, id, v)
  34.         return v
  35.  
  36.     
  37.     def _getextrema(self):
  38.         '''Get min/max values for each band in the image'''
  39.         
  40.         def minmax(histogram):
  41.             n = 255
  42.             x = 0
  43.             for i in range(256):
  44.                 if histogram[i]:
  45.                     n = min(n, i)
  46.                     x = max(x, i)
  47.                     continue
  48.             
  49.             return (n, x)
  50.  
  51.         v = []
  52.         for i in range(0, len(self.h), 256):
  53.             v.append(minmax(self.h[i:]))
  54.         
  55.         return v
  56.  
  57.     
  58.     def _getcount(self):
  59.         '''Get total number of pixels in each layer'''
  60.         v = []
  61.         for i in range(0, len(self.h), 256):
  62.             v.append(reduce(operator.add, self.h[i:i + 256]))
  63.         
  64.         return v
  65.  
  66.     
  67.     def _getsum(self):
  68.         '''Get sum of all pixels in each layer'''
  69.         v = []
  70.         for i in range(0, len(self.h), 256):
  71.             sum = 0.0
  72.             for j in range(256):
  73.                 sum = sum + j * self.h[i + j]
  74.             
  75.             v.append(sum)
  76.         
  77.         return v
  78.  
  79.     
  80.     def _getsum2(self):
  81.         '''Get squared sum of all pixels in each layer'''
  82.         v = []
  83.         for i in range(0, len(self.h), 256):
  84.             sum2 = 0.0
  85.             for j in range(256):
  86.                 sum2 = sum2 + j ** 2 * float(self.h[i + j])
  87.             
  88.             v.append(sum2)
  89.         
  90.         return v
  91.  
  92.     
  93.     def _getmean(self):
  94.         '''Get average pixel level for each layer'''
  95.         v = []
  96.         for i in self.bands:
  97.             v.append(self.sum[i] / self.count[i])
  98.         
  99.         return v
  100.  
  101.     
  102.     def _getmedian(self):
  103.         '''Get median pixel level for each layer'''
  104.         v = []
  105.         for i in self.bands:
  106.             s = 0
  107.             l = self.count[i] / 2
  108.             b = i * 256
  109.             for j in range(256):
  110.                 s = s + self.h[b + j]
  111.                 if s > l:
  112.                     break
  113.                     continue
  114.             
  115.             v.append(j)
  116.         
  117.         return v
  118.  
  119.     
  120.     def _getrms(self):
  121.         '''Get RMS for each layer'''
  122.         v = []
  123.         for i in self.bands:
  124.             v.append(math.sqrt(self.sum2[i] / self.count[i]))
  125.         
  126.         return v
  127.  
  128.     
  129.     def _getvar(self):
  130.         '''Get variance for each layer'''
  131.         v = []
  132.         for i in self.bands:
  133.             n = self.count[i]
  134.             v.append((self.sum2[i] - self.sum[i] ** 2.0 / n) / n)
  135.         
  136.         return v
  137.  
  138.     
  139.     def _getstddev(self):
  140.         '''Get standard deviation for each layer'''
  141.         v = []
  142.         for i in self.bands:
  143.             v.append(math.sqrt(self.var[i]))
  144.         
  145.         return v
  146.  
  147.  
  148. Global = Stat
  149. if __name__ == '__main__':
  150.     im = Image.open('Images/lena.ppm')
  151.     st = Stat(im)
  152.     print 'extrema', st.extrema
  153.     print 'sum    ', st.sum
  154.     print 'mean   ', st.mean
  155.     print 'median ', st.median
  156.     print 'rms    ', st.rms
  157.     print 'sum2   ', st.sum2
  158.     print 'var    ', st.var
  159.     print 'stddev ', st.stddev
  160.  
  161.